package com.gzc.just.play.last.war.sceneserver.effect;

import com.gzc.just.play.last.war.sceneserver.gameobject.unit.GameUnit;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 状态效果基类 - 代表一个持续的游戏状态效果
 *
 * 支持：
 * - 固定持续时间效果
 * - 堆叠（多个相同效果）
 * - 覆盖（新效果覆盖旧效果）
 * - 生命周期回调
 *
 * 对应C++的 SSPassitiveEffect 基类
 *
 * @author AI编程助手
 * @version 1.0
 * @since 2025-11-22
 */
public abstract class StatusEffect {
    
    private static final Logger log = LoggerFactory.getLogger(StatusEffect.class);
    
    protected final String id;
    protected final StatusType statusType;
    protected final GameUnit target;
    protected final GameUnit source; // 施加者，可为null
    protected final long duration; // 效果持续时间（毫秒）
    protected long startTime;
    protected long endTime;
    protected int stackCount; // 堆叠次数
    protected boolean active;
    
    // 效果参数
    protected int level; // 效果等级
    protected double power; // 效果强度
    
    /**
     * 创建状态效果
     *
     * @param id 效果ID
     * @param statusType 状态类型
     * @param target 目标单位
     * @param duration 持续时间（毫秒）
     * @param source 施加者，可为null
     * @param level 效果等级
     * @param power 效果强度
     */
    public StatusEffect(String id, StatusType statusType, GameUnit target, 
                       long duration, GameUnit source, int level, double power) {
        this.id = id;
        this.statusType = statusType;
        this.target = target;
        this.duration = duration;
        this.source = source;
        this.level = level;
        this.power = power;
        this.stackCount = 1;
        this.active = true;
        this.startTime = System.currentTimeMillis();
        this.endTime = duration < 0 ? Long.MAX_VALUE : startTime + duration;
    }
    
    public String getId() {
        return id;
    }
    
    public StatusType getStatusType() {
        return statusType;
    }
    
    public GameUnit getTarget() {
        return target;
    }
    
    public GameUnit getSource() {
        return source;
    }
    
    public long getDuration() {
        return duration;
    }
    
    public long getStartTime() {
        return startTime;
    }
    
    public long getEndTime() {
        return endTime;
    }
    
    public int getStackCount() {
        return stackCount;
    }
    
    public boolean isActive() {
        return active;
    }
    
    public int getLevel() {
        return level;
    }
    
    public double getPower() {
        return power;
    }
    
    /**
     * 获取剩余持续时间（毫秒）
     */
    public long getRemainingDuration() {
        if (duration < 0) {
            return -1; // 永久效果
        }
        
        long remaining = endTime - System.currentTimeMillis();
        return Math.max(0, remaining);
    }
    
    /**
     * 检查效果是否已过期
     */
    public boolean isExpired() {
        if (duration < 0) {
            return false; // 永久效果不过期
        }
        return System.currentTimeMillis() >= endTime;
    }
    
    /**
     * 堆叠效果（多个相同效果时调用）
     */
    public void stack() {
        stackCount++;
        log.debug("效果 {} 堆叠，当前堆叠数: {}", statusType.getDisplayName(), stackCount);
    }
    
    /**
     * 效果初始化时调用
     */
    public void onApply() {
        log.info("应用效果: {} 到目标 {}", statusType.getDisplayName(), target.getObjectId());
    }
    
    /**
     * 效果更新时调用（每帧调用）
     *
     * @param currentTime 当前时间
     * @param deltaTime 距离上次更新的时间间隔（毫秒）
     */
    public void onUpdate(long currentTime, long deltaTime) {
        // 子类可覆盖此方法
    }
    
    /**
     * 效果移除时调用
     */
    public void onRemove() {
        log.info("移除效果: {} 从目标 {}", statusType.getDisplayName(), target.getObjectId());
    }
    
    /**
     * 效果被刷新时调用（重新应用相同效果）
     */
    public void onRefresh() {
        log.debug("刷新效果: {}", statusType.getDisplayName());
        this.startTime = System.currentTimeMillis();
        this.endTime = duration < 0 ? Long.MAX_VALUE : startTime + duration;
    }
    
    /**
     * 检查效果是否满足移除条件
     *
     * @return 如果应该移除效果，返回true
     */
    public boolean shouldRemove() {
        return isExpired() || !active || target == null || !target.isAlive();
    }
    
    /**
     * 手动移除效果
     */
    public void remove() {
        this.active = false;
        onRemove();
    }
    
    /**
     * 获取效果的字符串描述
     */
    @Override
    public String toString() {
        return String.format("StatusEffect{id='%s', type=%s, target=%d, remaining=%dms, stack=%d}",
            id, statusType.getDisplayName(), target.getObjectId(), getRemainingDuration(), stackCount);
    }
}
